package com.aasa.siccosap.dao;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.apache.log4j.Logger;

import com.aasa.siccosap.bean.DepositoBancario;
import com.aasa.siccosap.bean.ParametrosGenerales;
import com.aasa.siccosap.bean.SaldoBean;
import com.aasa.siccosap.util.Constantes;

import oracle.jdbc.OracleTypes;

	/**
	 * Data access object (DAO) for domain model class RegistroCuentaCorriente.
	 * 	 
	 */

public class DepositoBancarioDAO extends ConsultaClienteBaseDAO {
    
	//TODO - Sacar los saldos de este DAO y pasarlos al de Saldo  
	List<SaldoBean> saldosPendientesUltimaConsulta;
	
	static Logger logger = Logger.getLogger("AuxiliarDAO.class");
	public DepositoBancarioDAO()	throws accesoDaoException {
		super();
		this.saldosPendientesUltimaConsulta = new ArrayList<SaldoBean>();
	}
	
	public DepositoBancarioDAO(DataSource dataSource) {
		super(dataSource);
	}
	
    public List<DepositoBancario> consultarDepositosBancarios(ParametrosGenerales parametros) throws Exception{
    	ResultSet rs = null;
    	ResultSet rs2 = null;
        this.av_message = null;
        this.storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_CONSULTA_DEPOSITOS(?,?,?,?,?,?); end;";
        List<DepositoBancario> consultaDepositosBancarios = new ArrayList<DepositoBancario>();
        List<SaldoBean> consultaSaldosPendientes = new ArrayList<SaldoBean>();
        
        try{
                this.conn = dataSource.getConnection();
                this.stmt = this.conn.prepareCall(storedProcedure);
                              
                configuraParametrosConsultaDepositosBancarios(parametros);
                
                this.stmt.execute();

                //Se obtiene la respuesta error/exito del stored
                this.av_message = (String)stmt.getObject(1);
                	
                    if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
                        //Se obtiene el objeto del cursor
                        rs = (ResultSet)stmt.getObject(2);
                        while(rs.next()){
                        	DepositoBancario registroDepositoBancario = creaRegistroConsultaDepositosBancarios(rs);
                        	consultaDepositosBancarios.add(registroDepositoBancario);
                        }
                        rs2 = (ResultSet)stmt.getObject(3);
                        while(rs2.next()){
                        	SaldoBean registroSaldoPendiente = creaRegistroConsultaSaldosPendientes(rs2);
                        	consultaSaldosPendientes.add(registroSaldoPendiente);
                        }
                }else{
                	this.saldosPendientesUltimaConsulta = null;
                	return null;                    
                }

        }catch (Exception e){
                e.printStackTrace();
                this.saldosPendientesUltimaConsulta = null;
                return null;
        }finally{
        	System.out.println("se vuelve a caer");
        	close(this.conn, rs, stmt);
        	close(this.conn, rs2, stmt);
        }
         
     System.out.println("ESTE ES EL BANCO" + consultaDepositosBancarios.get(0).getStrPb_banco());
     System.out.println(consultaSaldosPendientes.get(0).getStrPb_referencia());
        this.saldosPendientesUltimaConsulta = consultaSaldosPendientes;
        return(consultaDepositosBancarios);   
             
    }
    

    private CallableStatement configuraParametrosConsultaDepositosBancarios(ParametrosGenerales parametros)
    throws SQLException{
            	
    	stmt.registerOutParameter(1, OracleTypes.VARCHAR);               
        stmt.registerOutParameter(2, OracleTypes.CURSOR);
        stmt.registerOutParameter(3, OracleTypes.CURSOR);
    	
        stmt.setString(4, parametros.getStrPb_codigoCliente());
                        
        java.sql.Date fechaInicioSQL = new java.sql.Date(parametros.getObjPb_fechaInicio().getTime());
        java.sql.Date fechaFinSQL = new java.sql.Date(parametros.getObjPb_fechaFin().getTime());
        stmt.setDate(5,fechaInicioSQL);	       
        stmt.setDate(6,fechaFinSQL);

        return(stmt);          
        
    }
    
    private SaldoBean creaRegistroConsultaSaldosPendientes(ResultSet rs) throws SQLException {
        
    	SaldoBean bean = new SaldoBean();
        
    	bean.setObjPb_fecha(rs.getDate("TC1_FECHA"));
    	bean.setDblPb_saldoSoles(rs.getDouble("SP_SOLES"));
    	//bean.setDblPb_saldoDolares(rs.getDouble("SP_DOLARES"));
    	bean.setStrPb_referencia(rs.getString("SP_REFERENCIA"));

        return (bean);
    }
    
    private DepositoBancario creaRegistroConsultaDepositosBancarios(ResultSet rs) throws SQLException {
        
    	DepositoBancario bean = new DepositoBancario();
        
        bean.setStrPb_banco(rs.getString("BANCO"));
        bean.setStrPb_cuentaBanco(rs.getString("CUENTA"));
        bean.setObjPb_fecha(rs.getDate("FECHA_DEPOSITO"));
        bean.setDblPb_importeSoles(rs.getDouble("IMPORTE_SOLES"));
        bean.setDblPb_importeDolares(rs.getDouble("IMPORTE_DOLARES"));
        bean.setStrPb_referencia(rs.getString("REFERENCIA"));

        return (bean);
    }


	public List<SaldoBean> getSaldosPendientesUltimaConsulta() {
		return saldosPendientesUltimaConsulta;
	}
        
}

